package com.linyaonan.leetcode.medium._647;

/**
 * 给定一个字符串，你的任务是计算这个字符串中有多少个回文子串。
 *
 * 具有不同开始位置或结束位置的子串，即使是由相同的字符组成，也会被视作不同的子串。
 *
 *  
 *
 * 示例 1：
 *
 * 输入："abc"
 * 输出：3
 * 解释：三个回文子串: "a", "b", "c"
 * 示例 2：
 *
 * 输入："aaa"
 * 输出：6
 * 解释：6个回文子串: "a", "a", "a", "aa", "aa", "aaa"
 *  
 *
 * 提示：
 *
 * 输入的字符串长度不会超过 1000 。
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/palindromic-substrings
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
class Solution {
    public int countSubstrings(String s) {
        if (s == null || "".equals(s)) {
            return 0;
        }
        // 单字符的情况直接返回
        if (s.length() == 1) {
            return 1;
        }
        // 首先全部的字符进行统计
        int count = s.length();
        double startIndex = 0.5D;

        while (startIndex <= ((double) s.length() - 1) - 0.5D) {
            //
            int left = (int) Math.floor(startIndex);
            int right = (int) Math.ceil(startIndex);
            // 表明在整数位置，而不是两树之间
            if (left == right) {
                left--;
                right++;
                while (checkCharHasEqual(s, left, right)) {
                    count++;
                    left--;
                    right++;
                }
            } else {
                // 然后向两边开始扩散
                while (checkCharHasEqual(s, left, right)) {
                    count++;
                    left--;
                    right++;
                }
            }
            // 每次向后移动0.5的位置
            startIndex += 0.5D;
        }

        return count;
    }


    private boolean checkCharHasEqual(String s, int leftIndex, int rightIndex) {
        if (leftIndex >= 0 && leftIndex < rightIndex && rightIndex < s.length()) {
            return s.charAt(leftIndex) == s.charAt(rightIndex);
        } else {
            return false;
        }
    }
}